BOJ_2467_용액

투 포인터(Two-Pointers)를 활용해서 0에 가장 가까운 합을 찾는 문제
부호에 관계 없이0에 가까운 합을 찾는 것이므로 절댓값을 활용했다

양 끝에서 포인터를 중앙으로 옮겨가면서 최솟값을 갱신한다
이렇게 풀었을 때 시간복잡도는 O(N)이다

번외로, 이분 탐색(Binary Search)으로 이 문제를 해결할 수 있다
인덱스를 0부터 N-1까지 늘려가며,
이분탐색으로 해당 인덱스의 값 + 탐색값이 가장 0에 가까운 것을 찾아 갱신한다
다만 이 방식으로 풀면 시간복잡도가 O(NlogN)이 되기 때문에 더 비효율적ㅇ

import sys  
  
input = sys.stdin.readline  
N = int(input())  
solution = list(map(int, input().split()))  
  
start = 0  
end = N - 1  
  
min_value = 2000000001  
val = (0, 0)  
  
while start < end:  
    now_val = abs(solution[start] + solution[end])  
  
    if now_val < min_value:  
        min_value = now_val  
        val = (solution[start], solution[end])  
  
    if solution[start] + solution[end] > 0:  
        end -= 1  
  
    elif solution[start] + solution[end] < 0:  
        start += 1  
  
    else:  
        break  
  
print(val[0], val[1])